Grokking-the-coding-interview

# Given a set of numbers that might contain duplicates, find all of its distinct subsets.
# Example:
# Input: [1, 3, 3]
# Output: [], [1], [3], [1,3], [3,3], [1,3,3]

# O(2^N) space: O(2^N)
def find_subsets_with_duplicates(arr):
    arr.sort()
    subsets = []
    subsets.append([])
    start_index, end_index = 0, 0
    for i in range(len(arr)):
        start_index = 0
        if i > 0 and arr[i] == arr[i - 1]:
            start_index = end_index + 1
        
        end_index = len(subsets) - 1
        for j in range(start_index, end_index + 1):
            subset = list(subsets[j])
            subset.append(arr[i])
            subsets.append(subset)
    
    return subsets

print(find_subsets_with_duplicates([1, 3, 3]))
print(find_subsets_with_duplicates([1, 5, 5, 3, 3]))